“There is an infinite amount of hope in the universe ... but not for us.”
― Franz Kafka
市場上每一隻旗艦手機都有指紋辨識,但是蘋果沒有
每一個主題會由一個或多個生產者 ( producer ) 去推送資料給該主題,而消費者 ( consumer ) 就可以訂閱該主題取得資料,新的訊息送達分區時會按照時間順序從偏移量 ( offset ) 0一直往上累加,這個偏移量是唯一可以確定訊息所在地的值。
如上圖所示,這個主題有四個分區,分區編號由0開始一直到3,每個分區的偏移量是獨立的、不會受到彼此影響,這裡也可以看到 Kafka 是保證該主題每個分區內的順序性,但是並不能保證從多個分區取得資料時的順序性。
因此主題如果有強順序性的需求,最常見的解決方式是這個主題的生產者必須指定特定一個分區寫入,這樣才能保證該主題的順序性,舉例來說,一個飯店訂房系統,同一筆訊息有幾種狀態:訂房、修改房型、結算、取消訂房,該筆訊息的修改房型訊息一定得等訂房訊息被消費者消費掉訂單成立後才能被取出,不然系統就會找不到該筆訂單,這種狀況可以將一個分區對應一間飯店的方式去處理,這樣每間飯店就都能保證其訂單順序正確了。
Kafka 是直接將資料存放到硬碟中來做到持久化的,接下來這邊來看實際上資料、主題、分區、叢集在檔案管理系統中
是怎麼儲存的。
$ tree broker1
broker1
├── meta.properties
├── test-topic123-0
│ ├── 00000000000000000000.index
│ ├── 00000000000000000000.log
│ ├── 00000000000000000000.timeindex
│ ├── leader-epoch-checkpoint
│ └── partition.metadata
├── test-topic123-1
│ ├── 00000000000000000003.index
│ ├── 00000000000000000003.log
│ ├── 00000000000000000003.timeindex
│ ├── leader-epoch-checkpoint
│ └── partition.metadata
├── test-topic123-2
│ ├── 00000000000000000044.index
│ ├── 00000000000000000044.log
│ ├── 00000000000000000044.timeindex
│ ├── leader-epoch-checkpoint
│ └── partition.metadata
├── test-topic123-3
│ ├── 00000000000000000018.index
│ ├── 00000000000000000018.log
│ ├── 00000000000000000018.timeindex
│ ├── leader-epoch-checkpoint
│ └── partition.metadata
├── other-topic-0
│ ├── 00000000000000000001.index
│ ├── 00000000000000000001.log
│ ├── 00000000000000000001.timeindex
│ ├── leader-epoch-checkpoint
│ └── partition.metadata
每個 Kafka broker 就是一個資料夾,在這個資料夾中再去存放每個主題的分區資料,這邊一一介紹主題分區資料中的檔案
.log
檔 => 這個檔案是訊息實際存放的檔案,檔案名稱會依據該檔案中第一筆訊息的偏移量去命名.index
檔 => 是紀錄訊息所在的物理檔案位置,命名規則同.log檔.timeindex
檔 => 是紀錄時間戳和偏移量的紀錄,命名規則同.log檔leader-epoch-checkpoint
=> 是紀錄分區領導者 ( partition leader ) 的版本資料和偏移量partition-metadata
=> 紀錄主題編號 ( topic_id )
$ cat partition.metadata
version: 0
topic_id: BAocHAwHR_STmwAUlI3YMw
$ cat leader-epoch-checkpoint
0
1
77 0
實際上 log 檔會依據設定切分為多個 log segment,建議設定切分上限不要太低,切分太多會影響儲存在硬碟中的順序性,而 Kafka 的超高吞吐量就是依靠順序寫入硬碟而來。
├── test-topic123-1
│ ├── 00000000000000000003.index
│ ├── 00000000000000000003.log
│ ├── 00000000000000000003.timeindex
│ ├── 00000000000000000006.index
│ ├── 00000000000000000006.log
│ ├── 00000000000000000006.timeindex
│ ├── leader-epoch-checkpoint
│ └── partition.metadata
broker 的資料後續會再介紹,今天主要讓大家初步了解 Kafka 的系統組成、最小的訊息單位存放了什麼資料和主題分區的相關介紹。